;;; Commentary:
-; Steve Strassmann (straz@media-lab.media.mit.edu) didn't write
+; Steve Strassmann <straz@media-lab.media.mit.edu> didn't write
; this, and even if he did, he really didn't mean for you to use it
; in an anarchistic way.
;
; To use this:
-; Make sure you have the variable SPOOK-PHRASES-FILE pointing to
-; a valid phrase file. Phrase files are in the same format as
-; zippy's yow.lines (ITS-style LINS format).
-; Strings are terminated by ascii 0 characters. Leading whitespace ignored.
-; Everything up to the first \000 is a comment.
-;
; Just before sending mail, do M-x spook.
; A number of phrases will be inserted into your buffer, to help
; give your message that extra bit of attractiveness for automated
;;; Code:
+(require 'cookie)
+
; Variables
(defvar spook-phrases-file (concat data-directory "spook.lines")
"Keep your favorite phrases here.")
(defvar spook-phrase-default-count 15
"Default number of phrases to insert")
-(defvar spook-vector nil
- "Important phrases for NSA mail-watchers")
-
-; Randomize the seed in the random number generator.
-(random t)
-
-; Call this with M-x spook.
;;;###autoload
(defun spook ()
"Adds that special touch of class to your outgoing mail."
(interactive)
- (if (null spook-vector)
- (setq spook-vector (snarf-spooks)))
- (shuffle-vector spook-vector)
- (let ((start (point)))
- (insert ?\n)
- (spook1 (min (- (length spook-vector) 1) spook-phrase-default-count))
- (insert ?\n)
- (fill-region-as-paragraph start (point) nil)))
-
-(defun spook1 (arg)
- "Inserts a spook phrase ARG times."
- (cond ((zerop arg) t)
- (t (insert (aref spook-vector arg))
- (insert " ")
- (spook1 (1- arg)))))
-
-(defun snarf-spooks ()
- "Reads in the phrase file"
- (message "Checking authorization...")
- (save-excursion
- (let ((buf (generate-new-buffer "*spook*"))
- (result '()))
- (set-buffer buf)
- (insert-file-contents (expand-file-name spook-phrases-file))
- (search-forward "\0")
- (while (progn (skip-chars-forward " \t\n\r\f") (not (eobp)))
- (let ((beg (point)))
- (search-forward "\0")
- (setq result (cons (buffer-substring beg (1- (point)))
- result))))
- (kill-buffer buf)
- (message "Checking authorization... Approved.")
- (setq spook-vector (apply 'vector result)))))
-
-(defun pick-random (n)
- "Returns a random number from 0 to N-1 inclusive."
- (% (logand 0777777 (random)) n))
-
-; Thanks to Ian G Batten <BattenIG@CS.BHAM.AC.UK>
-; [of the University of Birmingham Computer Science Department]
-; for the iterative version of this shuffle.
-;
-(defun shuffle-vector (vector)
- "Randomly permute the elements of VECTOR (all permutations equally likely)"
- (let ((i 0)
- j
- temp
- (len (length vector)))
- (while (< i len)
- (setq j (+ i (pick-random (- len i))))
- (setq temp (aref vector i))
- (aset vector i (aref vector j))
- (aset vector j temp)
- (setq i (1+ i))))
- vector)
+ (cookie-insert
+ spook-phrases-file
+ spook-phrase-default-count
+ "Checking authorization"
+ "Checking authorization...Approved"))
+
+;; Note: the implementation that used to take up most of this file has
+;; been cleaned up and generalized and now resides in cookie.el.
;;; spook.el ends here
;;; yow.el --- generate random zippyisms
-;; Copyright (C) 1985, 1987 Free Software Foundation, Inc.
+;; Copyright (C) 1993 Free Software Foundation, Inc.
;; Maintainer: FSF
;; Keywords: games
;;; Commentary:
;; Important pinheaddery for GNU Emacs.
-;; Expects file emacs/etc/yow.lines to be in ITS-style LINS format
-;; (ie strings terminated by ascii 0 characters. Leading whitespace ignored)
-;; Everything up to the first \000 is a comment.
+;;
+;; See cookie.el for implementation. Note --- the `n' argument of yow
+;; from the 18.xx implementation is no longer; we only support *random*
+;; random access now.
;;; Code:
-; Randomize the seed in the random number generator.
-(random t)
+(require 'cookie)
+
+(defvar yow-file (concat data-directory "yow.lines")
+ "Pertinent pinhead phrases.")
;;;###autoload
-(defun yow (&optional n interactive)
- "Return or display a Zippy quotation."
- (interactive "P\np")
- (if (null yow-vector)
- (setq yow-vector (snarf-yows)))
- (cond (n (setq n (prefix-numeric-value n)))
- ((>= (setq n (random (length yow-vector))) 0))
- (t (setq n (- n))))
- (let ((yow (aref yow-vector n)))
+(defun yow (&optional interactive)
+ "Return or display a random Zippy quotation."
+ (interactive "P")
+ (let ((yow (cookie
+ yow-file "Am I CONSING yet?..." "I have SEEN the CONSING!!")))
(cond ((not interactive)
yow)
((not (string-match "\n" yow))
(with-output-to-temp-buffer "*Help*"
(princ yow))))))
-(defvar yow-vector nil "Pertinent pinhead statements")
-(defun snarf-yows (&optional file)
- (save-excursion
- (let ((buf (generate-new-buffer " yow"))
- (result '())
- (cursor-in-echo-area t))
- (message "Am I CONSING yet?...")
- (set-buffer buf)
- (insert-file-contents (or file
- (expand-file-name "yow.lines" data-directory)))
- (search-forward "\0")
- (while (progn (skip-chars-forward " \t\n\r\f") (not (eobp)))
- (let ((beg (point)))
- (search-forward "\0")
- (setq result (cons (buffer-substring beg (1- (point)))
- result))))
- (kill-buffer buf)
- (message "I have SEEN the CONSING!!" (length result))
- (apply 'vector (nreverse result)))))
\f
; Yowza!! Feed zippy quotes to the doctor. Watch results.
; fun, fun, fun. Entertainment for hours...